package com.demo.task.core;

import android.app.Notification;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * 作者： andli
 * 时间： 2017/11/7 13:43
 * 描述： 后台服务（轮询执行）
 */
public class BackService extends Service implements Runnable {

    public static List<Task> taskList = new ArrayList();// 任务列表

    public List<Task> getTaskList() {
        return taskList;
    }

    public static void addTask(Task task) {
        taskList.add(task);
    }

    SuperActivity superView;

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            HashMap<String, Object> hashMap = (HashMap<String, Object>) msg.obj;
            Object data = hashMap.get("data");
            superView = (SuperActivity) hashMap.get("con");

            superView.refresh(data); // 刷新页面（抽象方法）
        }
    };


    @Override
    public void onCreate() {
        super.onCreate();

        Log.i("andli", "---------启动主服务（主线程）---------");

        // 启动主线程
        Thread thread = new Thread(this);
        thread.start();

        // 升级为前台服务
        startForeground(1, new Notification());

    }

    @Override
    public void run() {
        // 轮询执行
        while (true) {

            try {
                if (taskList.size() > 0) {
                    Task task = null;
                    synchronized (taskList) {
                        if (taskList.size() > 0) {
                            task = taskList.get(0);
                            doTask(task);// 执行任务
                        }
                    }
                }
                Thread.sleep(3000); // 轮询时间间隔
                Log.i("andli", "后台任务轮询：" + new Date().toString());

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    /**
     * 执行Task（发送Message）
     *
     * @param task
     */
    private void doTask(Task task) {
        Message msg = mHandler.obtainMessage();
        try {
            task.exectue(msg);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            mHandler.sendMessage(msg);
            taskList.remove(task); // 移除Task
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}
